﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class PopupManager : ObjectBase
{
	const string PopupPrefabPath = "Prefab/Popup/";
    static string[] PopupPrefabName = new string[(int)PopupKind.Max]    //프리펩 이름과 스크립트 이름이 같을것!!
    {
		"Popup_OneButton",				// 버튼 한개 팝업
        "Popup_TwoButton",				// 버튼 두개 팝업
        "Popup_SpendKina",  		    // 키나 소비 팝업
        "Popup_CharacterEffect",    	// 케릭터 효과 팝업
        "Popup_AreaLevelUpReward",  	// 지역레벨업 보상팝업
        "Popup_DispatchReward",     	// 파견 보상 팝업
        "Popup_DispatchCancelReward",	// 파견 보상 팝업
		"Popup_QuickPVP",               // 빠른PVP 팝업
        "Popup_Tutorial",               // 튜토리얼
        "Popup_Character_Info",         // 케릭터 인포
        "Popup_Info_detail",			// 케릭터 인포 디테일
		"Popup_FindFriend",				// 친구 찾기
		"Popup_SelectFriend",			// 내 친구 선택
		"Popup_SuppressList",			// 토벌 목록
		"Popup_Lobby_vs20Detail",
		"Popup_Store_SlotSpin2",
		"Popup_Store_Get",
		"Popup_QuestComplete",
		"Popup_WriteMessage",
		"Popup_Error",
        "Popup_BossClear",
        "Popup_GameClear"
    };

	static PopupManager _instance = null;
    static public PopupManager Instance
	{
		get { if (_instance == null) { Create(); } return _instance; }
    }
    
	static public bool IsPopupExist = false;

    // 터치 관련 변수
    public Camera m_PopupUICamera = null;
    public Stack<Popup_Base> m_PopupStack = new Stack<Popup_Base>();

    GameObject m_BG = null;
    GameObject m_UIBG = null;
    Dictionary<UICamera, LayerMask> m_EventMask = new Dictionary<UICamera, LayerMask>();

    static public void Create()
    {
        GameObject popupPrefab = ResourceLoader.Load("Prefab/Popup/Popup_Manager") as GameObject;
        GameObject tempPopupManage = Instantiate(popupPrefab) as GameObject;
        tempPopupManage.name = "Popup_Manager";
        DontDestroyOnLoad(tempPopupManage);
        _instance = tempPopupManage.GetComponent<PopupManager>();
        _instance.gameObject.SetActive(false);
		IsPopupExist = false;
    }
    
    void Awake()
    {
        transform.position = new Vector3(1000.0f, 1000.0f, 0.0f);    //팝업은 멀리~
    }

	static public Popup_Base PushPopup(PopupKind popupKind)
	{
        if (!IsPopupExist) // UICamera touch 막기
        {
            Instance.m_EventMask.Clear();
			Instance.SetBlurEffectForCamera( true );
		}

		IsPopupExist = true;
        GameObject popupBgPrefab = null;
        GameObject tempPopup = null;
        Instance.gameObject.SetActive(true);

        popupBgPrefab = ResourceLoader.Load(string.Format("{0}{1}", PopupPrefabPath, PopupPrefabName[(int)popupKind])) as GameObject;
        Vector3 t_pos = popupBgPrefab.transform.localPosition;

        t_pos.z = 100000 -((Instance.m_PopupStack.Count + 1) * 1000);

        tempPopup = Instantiate(popupBgPrefab) as GameObject;
        tempPopup.transform.parent = Instance.m_PopupUICamera.transform;
        tempPopup.transform.localPosition = t_pos;// new Vector3(1.304791f, - 80.0f, 0.0f);
        tempPopup.transform.localScale = Vector3.one;

        UIPanel popupPn = tempPopup.GetComponent<UIPanel>();
        popupPn.depth = ((Instance.m_PopupStack.Count + 1) * 10);  //뎁스 카운트 * 10 (하위 패널은 1단위로 올림)
        //Debug.Log(popupPn.depth);
        // 팝업과 팝업 뎁스는 10 차이로 하고 팝업안에서 유아이패널은 9개 이하로 관리되어야 함
        // 팝업안의 패널은 상호 겹치지 않는 영역을 정의하고 있어야 함
                
        UIPanel[] panelList = tempPopup.GetComponentsInChildren<UIPanel>();
        foreach(UIPanel p in panelList)
        {           
            p.depth = popupPn.depth + p.depth;
        }

        Popup_Base popupSc = tempPopup.GetComponent(PopupPrefabName[(int)popupKind]) as Popup_Base;
        Instance.m_PopupStack.Push(popupSc);
        
        if (Instance.m_BG == null)
        {
            popupBgPrefab = ResourceLoader.Load(string.Format("{0}{1}", PopupPrefabPath, "Popup_BG")) as GameObject;
            Instance.m_BG = Instantiate(popupBgPrefab) as GameObject;
            Instance.m_BG.transform.parent = Instance.transform;
            Instance.m_BG.transform.localPosition = Vector3.zero;
            Instance.m_BG.transform.localScale = Vector3.one;
            Instance.m_UIBG = Instance.m_BG.transform.Find("UI_bg").gameObject;
        }

        if (popupSc.m_IsNeedStandardBG)
            Instance.m_BG.SetActive(true);
        else
            Instance.m_BG.SetActive(false);

        Instance.ShowFirstPopup();

        return popupSc;
    }

    static public void PopPopup()
    {
        if (Instance.m_PopupStack.Count < 1)
            return;
		
		Popup_Base popupSc = Instance.m_PopupStack.Pop();
        //popupSc.BackButton();

        Destroy(popupSc.gameObject);

        if (Instance.m_PopupStack.Count < 1)            //팝업이 하나도 없으면 팝업 배경 삭제  
        {
            IsPopupExist = false;
			Instance.SetBlurEffectForCamera( false );
			Instance.gameObject.SetActive( false );
            Instance.m_BG.SetActive(false);

            foreach (KeyValuePair<UICamera, LayerMask> mask in Instance.m_EventMask)    // ui카메라들 이벤트마스트 복구
            {
                if (mask.Key != null)
                {
                    mask.Key.eventReceiverMask = mask.Value;
                }
            }

			//Ui 카메라 터치 인식
        }
        else   // 팝이후 이전 팝업 배경 따라감
        {
            popupSc = Instance.m_PopupStack.Peek();

            if (popupSc.m_IsNeedStandardBG)
                Instance.m_BG.SetActive(true);
            else
                Instance.m_BG.SetActive(false);

            Instance.ShowFirstPopup();
        }
    }

	
	private void SetBlurEffectForCamera( bool isBlur )
	{
		if (isBlur)
		{
			var blur_effect = Popup_Blur.Activate( camera , 2);
			if( blur_effect == null )
				return;

			foreach( Camera tCam in Camera.allCameras )
			{
				//TODO: 우선은 특정 팝업에 대해서 처리를 막았으나, 다른 방식으로 수정 예정  (by timwalker)
				if( tCam != m_PopupUICamera && tCam != camera )  // 팝업카메라 제외
				{
					// 희소대리님~ 
					// 최적화 이슈때문에 임의로 수정했습니다.
					// by 진현

					// 최적화 이슈로 다시 수정 합니다.
					// by forour.

					Popup_Blur.AddBackground( blur_effect, tCam );
				}

				if( tCam != m_PopupUICamera )  // 팝업카메라 제외
				{
					UICamera uiCam = tCam.GetComponent<UICamera>();
					if( uiCam != null )
					{
                        if (!m_EventMask.ContainsKey(uiCam))
                        {
                            m_EventMask.Add(uiCam, uiCam.eventReceiverMask);
                            uiCam.eventReceiverMask = 0;
                        }
					}
				}
			}
		}
		else
		{
			var blur_effect = Popup_Blur.GetActivated( camera );
			if( blur_effect == null )
				return;
            
			foreach( Camera tCam in Camera.allCameras )
			{
				//TODO: 우선은 특정 팝업에 대해서 처리를 막았으나, 다른 방식으로 수정 예정  (by timwalker)
				if( tCam != m_PopupUICamera && tCam != camera )  // 팝업카메라 제외
				{
					Popup_Blur.RemoveBackground( blur_effect, tCam );
				}
			}

            if (FadeScreen.Instance.m_Camera != null)
                Popup_Blur.RemoveBackground(blur_effect, FadeScreen.Instance.m_Camera.camera);
            if (ToastManager.Instance.toastCamera != null)
                Popup_Blur.RemoveBackground(blur_effect, ToastManager.Instance.toastCamera.camera);
            
			Popup_Blur.Deactivate( camera );
		}
	}

    void ShowFirstPopup()
    {
        foreach(Popup_Base pb in m_PopupStack)
        {
            pb.gameObject.SetActive(pb == m_PopupStack.Peek());               
        }
    }
}
